PyVista 中的几何和网格连接性/拓扑

在我们之前的示例中,我们将“网格”定义为三个断开连接的点。虽然这对于表示“点云”很有用,但如果我们想创建表面,则必须描述网格的连接性。为此,让我们定义一个由三个点组成的单个单元,顺序与我们之前定义的相同。

code.matlab
>>> cells = [3, 0, 1, 2]

注意

观察我们如何必须插入前导 3 以告诉 VTK 我们的面由三个元素描述,在这种情况下,三个点。在我们的 PolyData 中,VTK 不假设面总是包含三个点,因此我们必须定义它。这实际上让我们可以灵活地根据需要定义每个单元尽可能多(或尽可能少至一个)的点。

注意

所有单元类型遵循相同的连接性数组格式:

[点的数量,点 1,点 2,...]

多面体类型除外,其中我们需要定义单元的每一面。此类型的格式如下:

[元素数量,面数量,面1点数,点1,点2,...,点N,面2点数,...]。

其中元素数量是描述此单元的数组中的总元素数。

现在我们已经拥有了组装包含单个三角形的 PolyData 实例的所有必要部分。为此,我们只需将点以及单元提供给 PolyData 的构造函数。我们可以从表示中看到此几何包含三个点和一个单元

code.matlab
>>> mesh = pv.PolyData(points, cells)
>>> mesh

让我们也绘制它:

code.matlab
mesh = pv.PolyData(points, [3, 0, 1, 2])
mesh.plot(cpos='xy', show_edges=True)
Document Image
\[\]

与此同时,让我们注释此图以描述此网格。

code.matlab
pl = pv.Plotter()
pl.add_mesh(mesh, show_edges=True, line_width=5)
label_coords = mesh.points + [0, 0, 0.01]
pl.add_point_labels(
    label_coords,
    [f'Point {i}' for i in range(3)],
    font_size=20,
    point_size=20,
    always_visible=True,
)
pl.add_point_labels([0.43, 0.2, 0], ['Cell 0'], font_size=20)
pl.camera_position = 'xy'
pl.show()
您可以清楚地看到多边形是如何基于点的连接性创建的。

Inline Image您可以清楚地看到多边形是如何基于点的连接性创建的。

此实例有几个属性来访问网格的底层数据。例如,如果您希望访问或修改网格的点,只需使用 points 访问 points 属性。

code.matlab
>>> mesh.points
pyvista_ndarray([[0.   , 0.   , 0.   ],
                 [1.   , 0.   , 0.   ],
                 [0.5  , 0.667, 0.   ]])

连接性也可以从 faces 属性访问:

code.matlab
>>> mesh.faces
array([3, 0, 1, 2])

或者我们可以简单地通过以下方式获取网格的表示:

code.matlab
>>> mesh

在此表示中我们看到:

这与 VTK 的输出大不相同。请参阅对象表示以比较两个表示。

此网格不包含数据数组,因为它仅由几何组成。这使得它对于仅绘制网格的几何很有用,但数据集通常包含不止几何的内容。例如:

虽然这些数据集中的每一个都可以表示为不同的几何类,但它们都包含点、单元或字段数据,解释几何中某个位置的数据值。